#https://www.cnblogs.com/yoyoketang/p/6557421.html
import time
import xlrd
import xlwt
import requests
import os
from selenium import webdriver

#新建excel用于储存
workbook = xlwt.Workbook(encoding = 'ascii')
worksheet = workbook.add_sheet('爬取结果')
worksheet.write(0, 0, label = '原表提供的名称')
worksheet.write(0, 1, label = '爬取到的名称')
worksheet.write(0, 2, label = '爬取到的地址')
print("******************************************")
print("******************************************")
print("**                                      **")
print("**     欢迎使用自动爬取工商信息软件     **")
print("**    本软件暂时只支持[FireFox浏览器]   **")
print("**                                      **")
print("******************************************")
print("******************************************")
print(" ")
print("如果发现BUG，请联系审计七部 陈超仪")
print("本软件仅可用于获取审计所需资料，切勿用于其他用途")
print("爬取信息来源网上，本软件制作者不对信息正确性负任何责任")
print(" ")
#==================选择模式==================
print("【0】-----教学模式-----：我从来没用过，请先给我介绍一下")
print("【1】-----精简模式-----：只爬取地址和基础信息，速度快且不易出错")
print("【2】----自定义模式----：提供部分可自定义的选项，速度稍慢")
print("【3】-----详细模式-----：小孩子才做选择，我全都要！")
str4 = input("请选择工作模式（输入数字0-3）:")
print(" ")
while not (str4 == '1' or str4 == '2'or str4 == '3' or str4 == '0'):
    print("【0】-----教学模式-----：我从来没用过，请先给我介绍一下")
    print("【1】-----精简模式-----：只爬取地址和基础信息，速度快且不易出错")
    print("【2】----自定义模式----：提供部分可自定义的选项，速度稍慢")
    print("【3】-----详细模式-----：小孩子才做选择，我全都要！")
    str4 = input("请选择工作模式（输入数字0-3）:")
    print(" ")
#==================教学==================
if str4 == '0':
    print(" ")
    print("此程序需要[FireFox浏览器]的支持才能使用，请前往官网进行下载：http://www.firefox.com.cn/")
    print("下载后请自行完成安装")
    str1 = input("安装完毕或已经安装[FireFox浏览器]，请按回车继续...")
    print(" ")
    print("请将需要查询的客户名称填入根目录的name.xls工作簿的sheet1工作表中,从第一列第二行的单元格，依次往下填。")
    str1 = input("填写完毕后，请保存并关闭name.xls，直接按回车继续...（找不到name.xls吗？---->请输入“get”后按回车获取：）")
    if str1 == "get":
        workbook2 = xlwt.Workbook(encoding = 'ascii')
        worksheet2 = workbook2.add_sheet('sheet1')
        worksheet2.write(0, 0, label = '客户名称')
        workbook2.save('name.xls')
        print(" ")
        print("已经在程序根目录下创建名为name.xls的Excel文件")
        print("请在表格第一列第二行开始填写需要查询的企业名称")
        str1 = input("填写完成后请保存并关闭name.xls文件，然后按回车继续...")
        print(" ")
    while not (str4 == '1' or str4 == '2'or str4 == '3'):
        print("【1】-----精简模式-----：只爬取地址和基础信息，速度快且不易出错")
        print("【2】----自定义模式----：提供部分可自定义的选项，速度稍慢")
        print("【3】-----详细模式-----：小孩子才做选择，我全都要！")
        str4 = input("请选择工作模式（输入数字1-3）:")
        print(" ")
#打开企查查界面，要求登录
url = 'https://www.qichacha.com/user_login'
print(" ")
print("正在打开网页，请在下一个提示出现前，不要对浏览器进行任何操作")
print("（若弹出防火墙授权提示，请允许程序访问网络。）")
driver = webdriver.Firefox()
driver.get(url)
driver.maximize_window()
print(" ")
print("未注册用户有访问次数限制，请先登录企查查账户")
print("若只查询少量企业（如1-2个），可以不登录直接回车")
str1 = input("------------完成登陆后按回车继续------------")        
#=====读取excel文件，将文件名存入数组=====
fileaddr = os.getcwd()
ExcelFile=xlrd.open_workbook(r'%s\name.xls'%(fileaddr))
fileaddr1 = fileaddr + "\\截图"
fileaddr2 = fileaddr + "\\快照"
if not os.path.exists(fileaddr1):
    os.mkdir("截图") 
if not os.path.exists(fileaddr2):
    os.mkdir("快照")
sheet=ExcelFile.sheet_by_index(0)
nrows = sheet.nrows  #获取行数
rowc = 1
names=[]
while rowc < nrows:
    names.append(sheet.cell(rowc,0).value)
    rowc = rowc +1
#==================模式1================== 
if str4 == '1':
    print(" ")
    print("郑重提示：爬取结果信息来源于企查查，本软件制作者不对信息正确性负任何责任")
    print("相关信息的及时性取决于企查查的更新频率，使用时请自行考虑信息的适用性。")
    print(" ")
    worksheet.write(0, 3, label = '爬取到的其他信息')
    Ncount = 0
    while Ncount < nrows - 1:
        Ncount = Ncount + 1
        url = 'https://www.qichacha.com/search?key=' + names[Ncount-1]
        worksheet.write(Ncount, 0, label = names[Ncount-1])
        driver.get(url)
        print('%d/%d'%(Ncount, nrows - 1))
        time.sleep(1)
        name_found = driver.find_elements_by_class_name("ma_h1")  # 找到客户名的框框
        if name_found != []:            
            str1 = name_found[0].text
            print(str1)
            worksheet.write(Ncount, 1, label = str1)
            text2 = driver.find_elements_by_class_name("m-t-xs")  # 找到其他资料
            str1 = text2[0].text
            worksheet.write(Ncount, 3, label = str1)
            print(str1)
            str1 = text2[2].text
            print(str1)
            str1 = str1.replace("地址：","")
            worksheet.write(Ncount, 2, label = str1)
        else:
            worksheet.write(Ncount, 1, label = "未能查询到此单位")
    driver.close()
else:
#==================模式2==================
    bol1 = 10
    bol2 = "Y"
    bol3 = "Y"
    bol4 = 0.5
    delay1 = 0.5
    str2 = 0
    if str4 == '2':
        print(" ")
        bol1 = input("是否收集详细信息(【N】只收集关键信息/【输入其他任何内容】详细信息)：")
        print(" ")
        print("是否保存工商快照？（并不是所有的企业都有快照，企查查只保存了相对较大的企业的快照）")
        bol2 = input("(【N】不是/【输入其他任何内容】是)：")
        print(" ")
        bol3 = input("是否保存企查查网页截图(【N】不是/【输入其他任何内容】是)：")
        
        print(" ")
        print("查询过快会被企查查拉黑，默认延迟500毫秒")
        print("建议查询的企业数量越多，设置越长的延迟")
        bol4 = input("请设置查询间隔（毫秒）：")
        print(" ")
        for str3 in bol4:
            str2 = not str3.isdigit() + str2
        if str2 == 0:
            delay1 = int(bol4)
        else:
            delay1 = 500
        delay1 = delay1/1000        
#==================模式3==================     
    print(" ")
    print("若选择了[保存快照和截图]或者选择了[详细模式]，请先清空根目录下[快照]和[截图]两个文件夹内的文件，以免与本次保存的结果混在一起。")
    print("爬取结果会保存在根目录的“爬取结果.xls”中，若该文件有上次爬取的信息，请自行备份，否则会被覆盖遗失哟。")
    print("在爬取过程中，请勿打开“爬取结果.xls”文件，否则程序会因无法写入信息而终止。")
    str1 = input("完成上述操作后，按回车继续...")
    print(" ")
    print("郑重提示：爬取结果信息来源于企查查，本软件制作者不对信息正确性负任何责任")
    print("相关信息的及时性取决于企查查的更新频率，使用时请自行考虑信息的适用性。")
    print("现在开始爬取，请勿操作目标浏览器，静心等待爬取工作完成")
    print(" ")
    worksheet.write(0, 3, label = '法人')
    worksheet.write(0, 4, label = '经营范围')
    titlelist = ['注册资本','实缴资本','经营状态','成立日期','统一社会信用代码','纳税人识别号','注册号','组织机构代码','公司类型','所属行业','核准日期',
             '登记机关','所属地区','英文名','曾用名','参保人数','人员规模','营业期限']
    index1 = 5
    if bol1 == "N":
        titlelist = titlelist[0:6]
        bol1 = 4
    else:
        bol1 = 10
    #写入excel表头
    for str3 in titlelist:
        worksheet.write(0, index1, label = str3)
        index1 = index1 + 1
        Ncount = 0
    #按excel表名开始工作    
    while Ncount < nrows - 1:
        Ncount = Ncount + 1
        url = 'https://www.qichacha.com/search?key=' + names[Ncount-1]
        worksheet.write(Ncount, 0, label = names[Ncount-1])
        time.sleep(delay1)
        driver.get(url)
        print('%d/%d'%(Ncount, nrows - 1))
        name_found = driver.find_elements_by_class_name("ma_h1")  # 找到客户名的框框
        if name_found != []:            
            str1 = name_found[0].text
            print(str1)
            worksheet.write(Ncount, 1, label = str1)
            url = name_found[0].get_attribute('href')            
            time.sleep(delay1)
            driver.get(url)           
            str2 = driver.find_elements_by_class_name("ntable")
            str3 = str2[0].text
            if str2[0].text[0:4] != "注册资本":
                url2 = url
                url2 = url2.replace("firm","cbase")
                url2 = url2.replace(".html","")
                time.sleep(delay1)
                driver.get(url2)
                str2 = driver.find_elements_by_class_name("ntable")
            str1 = str2[1].text
            if str1 != '':
                list1 = str1.split("\n")
                if list1[0][0:4] == "注册资本":
                    str2 = list1[9].replace("企业地址：","")
                    str2 = str2.replace("查看地图","")
                    str2 = str2.replace("附近公司","")
                    str2 = str2.strip()
                    worksheet.write(Ncount, 2, label = str2) #企业地址
                    str2 = list1[10].replace("经营范围：","")
                    str2 = str2.strip()
                    worksheet.write(Ncount, 4, label = str2) #经营范围
                    for index1 in range(1,bol1):
                        str1 = list1[index1 - 1]
                        list2 = str1.split(" ")
                        str1 = list2[1]
                        num1 =index1 * 2 + 3
                        worksheet.write(Ncount, num1, label = str1) #注册资本 等
                        str1 = list2[3:]
                        num1 =index1 * 2 + 4
                        worksheet.write(Ncount, num1, label = str1) #实缴资本 等
                else:
                    worksheet.write(Ncount, 2, label = "预设格式不符：%s"%(str1))
                    print('预设格式不符，未能正确填列表格信息。')
            else:
                worksheet.write(Ncount, 2, label = "未知错误，未能填列表格信息")
                print('未知错误，未能填列表格信息。')
            workbook.save('爬取结果.xls')    
            #=========保存截图========
            if bol3 != "N":
                driver.set_window_size(1400, 11300)
                driver.get_screenshot_as_file("%s\\截图 %d.%s.png"%(fileaddr1,Ncount,names[Ncount-1]))     
            #=======下载公示快照=====
            if bol2 != "N":
                url = url.replace("firm","snapshoot")
                time.sleep(delay1)
                driver.get(url)
                str2 = driver.find_elements_by_id("download-snapshoot")
                if str2 != []:
                    url = str2[0].get_attribute('href')
                    time.sleep(delay1)
                    r = requests.get(url)
                    str1 = "%s\\快照 %d.%s.png"%(fileaddr2,Ncount,names[Ncount-1])
                    with open(str1, 'wb') as file1:
                        file1.write(r.content)
                else:
                    print('未能获取工商信息快照，可能企查查未保存该单位快照。')
                   
        else:
            worksheet.write(Ncount, 1, label = "未能查询到此单位")
            print("未能查询到此单位")
    driver.close()


#=========导出结果，退出==========    
workbook.save('爬取结果.xls')
print('爬取完成！')
bol3 = input("按回车退出...")
driver.quit()

#driver.set_window_size(1400, 2800)
#driver.get_screenshot_as_file("C:\\Users\\BDO-20170830-8\\Desktop\\实验\\%d.%s.png"%(Ncount,str1)) 
